package com.xuan.core.service.pg.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuan.core.dto.pg.PgQiMenDouZhuanXingYiDto;
import com.xuan.core.dto.pg.PgQiMenDto;
import com.xuan.core.mapper.pg.PgQiMenMapper;
import com.xuan.core.pojo.pg.PgQiMen;
import com.xuan.core.service.pg.PgQiMenService;
import com.xuan.core.service.sys.SysCountService;
import com.xuan.core.vo.pg.PgFeiQiMenVo;
import com.xuan.core.vo.pg.PgZhuanQiMenVo;
import com.xuan.utils.pg.qimen.fei.FeiQiMen;
import com.xuan.utils.pg.qimen.fei.FeiQiMenSetting;
import com.xuan.utils.pg.qimen.fei.FeiQiMenUtil;
import com.xuan.utils.pg.qimen.zhuan.ZhuanQiMen;
import com.xuan.utils.pg.qimen.zhuan.ZhuanQiMenSetting;
import com.xuan.utils.pg.qimen.zhuan.ZhuanQiMenUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 奇门排盘Impl
 */
@Service
public class PgQiMenServiceImpl extends ServiceImpl<PgQiMenMapper, PgQiMen> implements PgQiMenService {

    @Autowired
    private SysCountService sysCountService; // 系统统计Service

//********************************************************************************************************************************

    /**
     * 开始排盘
     *
     * @param dto 奇门排盘数据接收类
     * @return 排盘结果
     */
    @Override
    public Object starts(PgQiMenDto dto) {

        // 1、初始化奇门排盘数据返回类
        Object vo;

        // 2、判断排盘类型
        if (dto.getPaiPanType() == 0) {
            // 2.1、转盘
            vo = zhuanPanQiMen(dto);
        } else if (dto.getPaiPanType() == 1) {
            // 2.2、飞盘
            vo = feiPanQiMen(dto);
        } else {
            // 2.3、默认转盘
            vo = zhuanPanQiMen(dto);
        }

        // 3、增加1次总使用数
        sysCountService.saveUsageNumber();

        // 4、返回数据
        return vo;

    }

    /**
     * 斗转星移
     *
     * @param dto 奇门斗转星移数据接收类
     */
    @Override
    public Object douZhuanXingYi(PgQiMenDouZhuanXingYiDto dto) {

        // 1、初始化奇门排盘数据返回类
        Object vo;

        // 2、判断排盘模式
        if (dto.getPaiPanType() == 0) {
            // 2.1、转盘奇门
            vo = zhuanPanQiMenDouZhuanXingYi(dto);
        } else {
            // 2.2、飞盘奇门
            vo = feiPanQiMenDouZhuanXingYi(dto);
        }

        return vo;

    }

//================================================================================================================================

    /**
     * 转盘奇门
     *
     * @param dto 奇门排盘数据接收类
     * @return 排盘数据
     */
    private PgZhuanQiMenVo zhuanPanQiMen(PgQiMenDto dto) {

        // 1、拷贝转盘奇门排盘设置
        ZhuanQiMenSetting setting = new ZhuanQiMenSetting();
        BeanUtils.copyProperties(dto, setting);
        dto.setPaiPanMark(setting.getPaiPanMark()); // $ 排盘标识

        // 2、转盘奇门初始化
        ZhuanQiMen qiMen = new ZhuanQiMen(setting);

        // 3、封装转盘奇门排盘数据
        PgZhuanQiMenVo vo = new PgZhuanQiMenVo();
        BeanUtils.copyProperties(dto, vo); // 拷贝转盘奇门设置数据
        BeanUtils.copyProperties(qiMen, vo); // 拷贝转盘奇门排盘数据
        vo.setSex(dto.getSex() == 0 ? "女" : "男"); // 性别
        vo.setPaiPanMark(setting.getPaiPanMark()); // 排盘标识
        vo.setPaiPanType(0); // 排盘类型

        // 4、返回数据
        return vo;

    }

    /**
     * 飞盘奇门
     *
     * @param dto 奇门排盘数据接收类
     * @return 排盘数据
     */
    private PgFeiQiMenVo feiPanQiMen(PgQiMenDto dto) {

        // 1、拷贝飞盘奇门排盘设置
        FeiQiMenSetting setting = new FeiQiMenSetting();
        BeanUtils.copyProperties(dto, setting);
        dto.setPaiPanMark(setting.getPaiPanMark()); // $ 排盘标识

        // 2、飞盘奇门初始化
        FeiQiMen qiMen = new FeiQiMen(setting);

        // 3、封装飞盘奇门排盘数据
        PgFeiQiMenVo vo = new PgFeiQiMenVo();
        BeanUtils.copyProperties(dto, vo); // 拷贝飞盘奇门设置数据
        BeanUtils.copyProperties(qiMen, vo); // 拷贝飞盘奇门排盘数据
        vo.setSex(dto.getSex() == 0 ? "女" : "男"); // 性别
        vo.setPaiPanType(1); // 排盘类型

        // 4、返回数据
        return vo;

    }

    /**
     * 转盘奇门 - 斗转星移
     *
     * @param dto 奇门斗转星移数据接收类
     * @return 排盘数据
     */
    private PgZhuanQiMenVo zhuanPanQiMenDouZhuanXingYi(PgQiMenDouZhuanXingYiDto dto) {

        // 1.1、转全盘
        if (dto.getDouZhuanXingYiType() == 0) {
            zhuanPanZhuanQuanPan(dto); // 转全盘
            zhuanShiGanKeYing(dto); // 十干克应
            zhuanBaMenKeYing(dto); // 八门克应
            zhuanXingMenKeYing(dto); // 星门克应
            zhuanJiuXingShiYing(dto); // 九星时应
        }
        // 1.2、转地盘
        if (dto.getDouZhuanXingYiType() == 1) {
            zhuanPanZhuanDiPan(dto); // 转地盘
            zhuanShiGanKeYing(dto); // 十干克应
            zhuanBaMenKeYing(dto); // 八门克应
        }
        // 1.3、转天盘
        if (dto.getDouZhuanXingYiType() == 2) {
            zhuanPanZhuanTianPan(dto); // 转天盘
            zhuanShiGanKeYing(dto); // 十干克应
            zhuanBaMenKeYing(dto); // 八门克应
            zhuanXingMenKeYing(dto); // 星门克应
            zhuanJiuXingShiYing(dto); // 九星时应
        }
        // 1.4、转人盘
        if (dto.getDouZhuanXingYiType() == 3) {
            zhuanPanZhuanRenPan(dto); // 转人盘
            zhuanBaMenKeYing(dto); // 八门克应
            zhuanXingMenKeYing(dto); // 星门克应
        }
        // 1.5、转神盘
        if (dto.getDouZhuanXingYiType() == 4) {
            zhuanPanZhuanShenPan(dto); // 转神盘
        }

        // 2、月令相关
        zhuanBaGuaWangShuai(dto); // 八卦旺衰
        zhuanBaMenWangShuai(dto); // 八门旺衰
        zhuanJiuXingWangShuai(dto); // 九星旺衰

        // 3、拷贝返回结果数据
        PgZhuanQiMenVo vo = new PgZhuanQiMenVo();
        BeanUtils.copyProperties(dto, vo);

        // 4、返回结果
        return vo;

    }

    /**
     * 转盘奇门 - 斗转星移：转全盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanPanZhuanQuanPan(PgQiMenDouZhuanXingYiDto dto) {

        zhuanPanZhuanDiPan(dto); // 转地盘
        zhuanPanZhuanTianPan(dto); // 转天盘
        zhuanPanZhuanRenPan(dto); // 转人盘
        zhuanPanZhuanShenPan(dto); // 转神盘

    }

    /**
     * 转盘奇门 - 斗转星移：转地盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanPanZhuanDiPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> diPan = dto.getDiPan(); // 地盘奇仪（1~9宫）
        List<String> newDiPan = new ArrayList<>(); // 新地盘奇仪（1~9宫）
        Map<Integer, List<List<String>>> map = new HashMap<>(); // 保存地盘奇仪与落宫地支的关系（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newDiPan = shunShiZhen(diPan);
            map = ZhuanQiMenUtil.diPanQiYiLuoGongLink(newDiPan); // 计算地盘奇仪与落宫地支的关系（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newDiPan = niShiZhen(diPan);
            map = ZhuanQiMenUtil.diPanQiYiLuoGongLink(newDiPan); // 计算地盘奇仪与落宫地支的关系（1~9宫）
        }

        // 2、设置数据
        dto.setDiPan(newDiPan); // 新地盘奇仪（1~9宫）
        dto.setDiPanQiYiLuoGongLink(map); // 新地盘奇仪与落宫地支的关系（1~9宫）

    }

    /**
     * 转盘奇门 - 斗转星移：转天盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanPanZhuanTianPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> tianPan = dto.getTianPan(); // 天盘（1~9宫）
        List<String> tianPanQiYiToTq = dto.getTianPanQiYiToTq(); // 天盘奇仪，只包含天禽星（1~9宫）
        List<String> tianPanQiYiExTq = dto.getTianPanQiYiExTq(); // 天盘奇仪，不包含天禽星（1~9宫）
        List<String> newTianPan = new ArrayList<>(); // 新天盘（1~9宫）
        List<List<String>> newTianPanLuoGongStatus = new ArrayList<>(); // 新天盘落宫状态（1~9宫）
        List<String> newTianPanQiYiToTq = new ArrayList<>(); // 新天盘奇仪，只包含天禽星（1~9宫）
        List<String> newTianPanQiYiExTq = new ArrayList<>(); // 新天盘奇仪，不包含天禽星（1~9宫）
        Map<Integer, List<List<String>>> mapToTq = new HashMap<>(); // 保存新天盘奇仪与落宫地支的关系，只包含天禽星（1~9宫）
        Map<Integer, List<List<String>>> mapExTq = new HashMap<>(); // 保存新天盘奇仪与落宫地支的关系，不包含天禽星（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newTianPan = shunShiZhen(tianPan); // 新天盘（1~9宫）
            newTianPanLuoGongStatus = ZhuanQiMenUtil.jiuXingLuoGongStatus(newTianPan); // 新天盘落宫状态（1~9宫）
            newTianPanQiYiToTq = shunShiZhen(tianPanQiYiToTq); // 新天盘奇仪，只包含天禽星（1~9宫）
            newTianPanQiYiExTq = shunShiZhen(tianPanQiYiExTq); // 新天盘奇仪，不包含天禽星（1~9宫）
            Map<String, Map<Integer, List<List<String>>>> map = ZhuanQiMenUtil.tianPanQiYiLuoGongLink(newTianPanQiYiToTq, newTianPanQiYiExTq);// 计算天盘奇仪与落宫地支的关系（1~9宫）
            mapToTq = map.get("mapToTq"); /// 新天盘奇仪与落宫地支的关系，只包含天禽星（1~9宫）
            mapExTq = map.get("mapExTq"); // 新天盘奇仪与落宫地支的关系，不包含天禽星（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newTianPan = niShiZhen(tianPan); // 新天盘（1~9宫）
            newTianPanLuoGongStatus = ZhuanQiMenUtil.jiuXingLuoGongStatus(newTianPan); // 新天盘落宫状态（1~9宫）
            newTianPanQiYiToTq = niShiZhen(tianPanQiYiToTq); // 新天盘奇仪，只包含天禽星（1~9宫）
            newTianPanQiYiExTq = niShiZhen(tianPanQiYiExTq); // 新天盘奇仪，不包含天禽星（1~9宫）
            Map<String, Map<Integer, List<List<String>>>> map = ZhuanQiMenUtil.tianPanQiYiLuoGongLink(newTianPanQiYiToTq, newTianPanQiYiExTq);// 计算天盘奇仪与落宫地支的关系（1~9宫）
            mapToTq = map.get("mapToTq"); /// 新天盘奇仪与落宫地支的关系，只包含天禽星（1~9宫）
            mapExTq = map.get("mapExTq"); // 新天盘奇仪与落宫地支的关系，不包含天禽星（1~9宫）
        }

        // 2、设置数据
        dto.setTianPan(newTianPan); // 新天盘
        dto.setJiuXingLuoGongStatus(newTianPanLuoGongStatus); // 新天盘落宫状态（后天八卦1~9宫）
        dto.setTianPanQiYiToTq(newTianPanQiYiToTq); // 新天盘奇仪
        dto.setTianPanQiYiExTq(newTianPanQiYiExTq); // 新天盘奇仪
        dto.setTianPanQiYiLuoGongToTqLink(mapToTq); // 新天盘奇仪与落宫地支的关系，只包含天禽星（1~9宫）
        dto.setTianPanQiYiLuoGongExTqLink(mapExTq); // 新天盘奇仪与落宫地支的关系，不包含天禽星（1~9宫）

    }

    /**
     * 转盘奇门 - 斗转星移：转人盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanPanZhuanRenPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> renPan = dto.getRenPan(); // 人盘（1~9宫）
        List<String> newRenPan = new ArrayList<>(); // 新人盘（1~9宫）
        List<List<String>> newRenPanLuoGongStatus = new ArrayList<>(); // 新人盘落宫状态（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newRenPan = shunShiZhen(renPan);
            newRenPanLuoGongStatus = ZhuanQiMenUtil.baMenLuoGongStatus(newRenPan); // 计算八门落宫状态（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newRenPan = niShiZhen(renPan);
            newRenPanLuoGongStatus = ZhuanQiMenUtil.baMenLuoGongStatus(newRenPan); // 计算八门落宫状态（1~9宫）
        }

        // 2、设置数据
        dto.setRenPan(newRenPan); // 新人盘（1~9宫）
        dto.setBaMenLuoGongStatus(newRenPanLuoGongStatus); // 新人盘落宫状态（1~9宫）

    }

    /**
     * 转盘奇门 - 斗转星移：转神盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanPanZhuanShenPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> shenPan = dto.getShenPan(); // 神盘（1~9宫）
        List<String> newShenPan = new ArrayList<>(); // 新神盘（1~9宫）
        List<List<String>> newShenPanLuoGongStatus = new ArrayList<>(); // 新神盘落宫状态（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newShenPan = shunShiZhen(shenPan);
            newShenPanLuoGongStatus = ZhuanQiMenUtil.baShenLuoGongStatus(newShenPan); // 计算八神落宫状态（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newShenPan = niShiZhen(shenPan);
            newShenPanLuoGongStatus = ZhuanQiMenUtil.baShenLuoGongStatus(newShenPan); // 计算八神落宫状态（1~9宫）
        }

        // 2、设置数据
        dto.setShenPan(newShenPan); // 新神盘（1~9宫）
        dto.setBaShenLuoGongStatus(newShenPanLuoGongStatus); // 新神盘落宫状态（1~9宫）

    }

    /**
     * 转盘奇门 - 斗转星移：八卦旺衰
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanBaGuaWangShuai(PgQiMenDouZhuanXingYiDto dto) {

        List<List<String>> baGuaWangShuai = ZhuanQiMenUtil.baGuaWangShuai(dto.getJiJie());
        dto.setBaGuaWangShuai(baGuaWangShuai);

    }

    /**
     * 转盘奇门 - 斗转星移：八门旺衰
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanBaMenWangShuai(PgQiMenDouZhuanXingYiDto dto) {

        List<List<String>> baMenWangShuai = ZhuanQiMenUtil.baMenWangShuai(dto.getRenPan(), dto.getJiJie());
        dto.setBaMenWangShuai(baMenWangShuai);

    }

    /**
     * 转盘奇门 - 斗转星移：九星旺衰
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanJiuXingWangShuai(PgQiMenDouZhuanXingYiDto dto) {

        List<List<String>> jiuXingWangShuai = ZhuanQiMenUtil.jiuXingWangShuai(dto.getTianPan(), dto.getHourZhi());
        dto.setJiuXingWangShuai(jiuXingWangShuai);

    }

    /**
     * 转盘奇门 - 斗转星移：十干克应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanShiGanKeYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> shiGanKeYing = ZhuanQiMenUtil.shiGanKeYing(dto.getDiPan(), dto.getTianPanQiYiToTq(), dto.getTianPanQiYiExTq());
        dto.setShiGanKeYing(shiGanKeYing);

    }

    /**
     * 转盘奇门 - 斗转星移：八门克应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanBaMenKeYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> baMenKeYing = ZhuanQiMenUtil.baMenKeYing(dto.getRenPan(), dto.getDiPan(), dto.getTianPanQiYiToTq(), dto.getTianPanQiYiExTq());
        dto.setBaMenKeYing(baMenKeYing);

    }

    /**
     * 转盘奇门 - 斗转星移：星门克应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanXingMenKeYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> xingMenKeYing = ZhuanQiMenUtil.xingMenKeYing(dto.getTianPan(), dto.getRenPan());
        dto.setXingMenKeYing(xingMenKeYing);

    }

    /**
     * 转盘奇门 - 斗转星移：九星时应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void zhuanJiuXingShiYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> jiuXingShiYing = ZhuanQiMenUtil.jiuXingShiYing(dto.getHourZhi(), dto.getTianPan());
        dto.setJiuXingShiYing(jiuXingShiYing);

    }

    /**
     * 飞盘奇门 - 斗转星移
     *
     * @param dto 奇门斗转星移数据接收类
     * @return 排盘数据
     */
    private PgFeiQiMenVo feiPanQiMenDouZhuanXingYi(PgQiMenDouZhuanXingYiDto dto) {

        // 1.1、转全盘
        if (dto.getDouZhuanXingYiType() == 0) {
            feiPanZhuanQuanPan(dto); // 转全盘
            feiShiGanKeYing(dto); // 十干克应
            feiBaMenKeYing(dto); // 八门克应
            feiXingMenKeYing(dto); // 星门克应
            feiJiuXingShiYing(dto); // 九星时应
        }
        // 1.2、转地盘
        if (dto.getDouZhuanXingYiType() == 1) {
            feiPanZhuanDiPan(dto); // 转地盘
            feiShiGanKeYing(dto); // 十干克应
            feiBaMenKeYing(dto); // 八门克应
        }
        // 1.3、转天盘
        if (dto.getDouZhuanXingYiType() == 2) {
            feiPanZhuanTianPan(dto); // 转天盘
            feiShiGanKeYing(dto); // 十干克应
            feiBaMenKeYing(dto); // 八门克应
            feiXingMenKeYing(dto); // 星门克应
            feiJiuXingShiYing(dto); // 九星时应
        }
        // 1.4、转人盘
        if (dto.getDouZhuanXingYiType() == 3) {
            feiPanZhuanRenPan(dto); // 转人盘
            feiBaMenKeYing(dto); // 八门克应
            feiXingMenKeYing(dto); // 星门克应
        }
        // 1.5、转神盘
        if (dto.getDouZhuanXingYiType() == 4) {
            feiPanZhuanShenPan(dto); // 转神盘
        }

        // 2、月令相关
        feiBaGuaWangShuai(dto); // 八卦旺衰
        feiBaMenWangShuai(dto); // 八门旺衰
        feiJiuXingWangShuai(dto); // 九星旺衰

        // 3、拷贝返回结果数据
        PgFeiQiMenVo vo = new PgFeiQiMenVo();
        BeanUtils.copyProperties(dto, vo);

        // 4、返回结果
        return vo;

    }

    /**
     * 飞盘奇门 - 斗转星移：转全盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiPanZhuanQuanPan(PgQiMenDouZhuanXingYiDto dto) {

        feiPanZhuanDiPan(dto); // 转地盘
        feiPanZhuanTianPan(dto); // 转天盘
        feiPanZhuanRenPan(dto); // 转人盘
        feiPanZhuanShenPan(dto); // 转神盘

    }

    /**
     * 飞盘奇门 - 斗转星移：转地盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiPanZhuanDiPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> diPan = dto.getDiPan(); // 地盘奇仪（1~9宫）
        List<String> newDiPan = new ArrayList<>(); // 新地盘奇仪（1~9宫）
        Map<Integer, List<List<String>>> map = new HashMap<>(); // 保存地盘奇仪与落宫地支的关系（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newDiPan = shunShiZhen(diPan);
            map = FeiQiMenUtil.diPanQiYiLuoGongLink(newDiPan); // 计算地盘奇仪与落宫地支的关系（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newDiPan = niShiZhen(diPan);
            map = FeiQiMenUtil.diPanQiYiLuoGongLink(newDiPan); // 计算地盘奇仪与落宫地支的关系（1~9宫）
        }

        // 2、设置数据
        dto.setDiPan(newDiPan); // 新地盘奇仪（1~9宫）
        dto.setDiPanQiYiLuoGongLink(map); // 新地盘奇仪与落宫地支的关系（1~9宫）

    }

    /**
     * 飞盘奇门 - 斗转星移：转天盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiPanZhuanTianPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> tianPan = dto.getTianPan(); // 天盘（1~9宫）
        List<String> tianPanQiYi = dto.getTianPanQiYi(); // 天盘奇仪（1~9宫）
        List<String> newTianPan = new ArrayList<>(); // 新天盘（1~9宫）
        List<String> newTianPanQiYi = new ArrayList<>(); // 新天盘奇仪（1~9宫）
        List<List<String>> newTianPanLuoGongStatus = new ArrayList<>(); // 新天盘落宫状态（1~9宫）
        Map<Integer, List<List<String>>> newMap = new HashMap<>(); // 保存新天盘奇仪与落宫地支的关系（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newTianPan = shunShiZhen(tianPan); // 新天盘（1~9宫）
            newTianPanLuoGongStatus = FeiQiMenUtil.jiuXingLuoGongStatus(newTianPan); // 新天盘落宫状态（1~9宫）
            newTianPanQiYi = shunShiZhen(tianPanQiYi); // 新天盘奇仪（1~9宫）
            newMap = FeiQiMenUtil.tianPanQiYiLuoGongLink(newTianPanQiYi); // 新天盘奇仪与落宫地支的关系（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newTianPan = niShiZhen(tianPan); // 新天盘（1~9宫）
            newTianPanLuoGongStatus = FeiQiMenUtil.jiuXingLuoGongStatus(newTianPan); // 新天盘落宫状态（1~9宫）
            newTianPanQiYi = niShiZhen(tianPanQiYi); // 新天盘奇仪（1~9宫）
            newMap = FeiQiMenUtil.tianPanQiYiLuoGongLink(newTianPanQiYi); // 新天盘奇仪与落宫地支的关系（1~9宫）
        }

        // 2、设置数据
        dto.setTianPan(newTianPan); // 新天盘
        dto.setJiuXingLuoGongStatus(newTianPanLuoGongStatus); // 新天盘落宫状态（后天八卦1~9宫）
        dto.setTianPanQiYi(newTianPanQiYi); // 新天盘奇仪
        dto.setTianPanQiYiLuoGongLink(newMap); // 新天盘奇仪与落宫地支的关系（1~9宫）

    }

    /**
     * 飞盘奇门 - 斗转星移：转人盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiPanZhuanRenPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> renPan = dto.getRenPan(); // 人盘（1~9宫）
        List<String> newRenPan = new ArrayList<>(); // 新人盘（1~9宫）
        List<List<String>> newRenPanLuoGongStatus = new ArrayList<>(); // 新人盘落宫状态（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newRenPan = shunShiZhen(renPan);
            newRenPanLuoGongStatus = FeiQiMenUtil.baMenLuoGongStatus(newRenPan); // 计算八门落宫状态（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newRenPan = niShiZhen(renPan);
            newRenPanLuoGongStatus = FeiQiMenUtil.baMenLuoGongStatus(newRenPan); // 计算八门落宫状态（1~9宫）
        }

        // 2、设置数据
        dto.setRenPan(newRenPan); // 新人盘（1~9宫）
        dto.setBaMenLuoGongStatus(newRenPanLuoGongStatus); // 新人盘落宫状态（1~9宫）

    }

    /**
     * 飞盘奇门 - 斗转星移：转神盘
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiPanZhuanShenPan(PgQiMenDouZhuanXingYiDto dto) {

        List<String> shenPan = dto.getShenPan(); // 神盘（1~9宫）
        List<String> newShenPan = new ArrayList<>(); // 新神盘（1~9宫）
        List<List<String>> newShenPanLuoGongStatus = new ArrayList<>(); // 新神盘落宫状态（1~9宫）

        // 1.1、顺时针旋转
        if (dto.getDouZhuanXingYiMode() == 0) {
            newShenPan = shunShiZhen(shenPan);
            newShenPanLuoGongStatus = FeiQiMenUtil.jiuShenLuoGongStatus(newShenPan); // 计算九神落宫状态（1~9宫）
        }
        // 1.2、逆时针旋转
        if (dto.getDouZhuanXingYiMode() == 1) {
            newShenPan = niShiZhen(shenPan);
            newShenPanLuoGongStatus = FeiQiMenUtil.jiuShenLuoGongStatus(newShenPan); // 计算九神落宫状态（1~9宫）
        }

        // 2、设置数据
        dto.setShenPan(newShenPan); // 新神盘（1~9宫）
        dto.setJiuShenLuoGongStatus(newShenPanLuoGongStatus); // 新神盘落宫状态（1~9宫）

    }

    /**
     * 飞盘奇门 - 斗转星移：十干克应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiShiGanKeYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> shiGanKeYing = FeiQiMenUtil.shiGanKeYing(dto.getDiPan(), dto.getTianPanQiYi());
        dto.setShiGanKeYing(shiGanKeYing);

    }

    /**
     * 飞盘奇门 - 斗转星移：八门克应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiBaMenKeYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> baMenKeYing = FeiQiMenUtil.baMenKeYing(dto.getRenPan(), dto.getDiPan(), dto.getTianPanQiYi());
        dto.setBaMenKeYing(baMenKeYing);

    }

    /**
     * 飞盘奇门 - 斗转星移：星门克应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiXingMenKeYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> xingMenKeYing = FeiQiMenUtil.xingMenKeYing(dto.getTianPan(), dto.getRenPan());
        dto.setXingMenKeYing(xingMenKeYing);

    }

    /**
     * 飞盘奇门 - 斗转星移：九星时应
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiJiuXingShiYing(PgQiMenDouZhuanXingYiDto dto) {

        Map<Integer, List<String>> jiuXingShiYing = FeiQiMenUtil.jiuXingShiYing(dto.getHourZhi(), dto.getTianPan());
        dto.setJiuXingShiYing(jiuXingShiYing);

    }

    /**
     * 飞盘奇门 - 斗转星移：八卦旺衰
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiBaGuaWangShuai(PgQiMenDouZhuanXingYiDto dto) {

        List<List<String>> baGuaWangShuai = FeiQiMenUtil.baGuaWangShuai(dto.getJiJie());
        dto.setBaGuaWangShuai(baGuaWangShuai);

    }

    /**
     * 飞盘奇门 - 斗转星移：八门旺衰
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiBaMenWangShuai(PgQiMenDouZhuanXingYiDto dto) {

        List<List<String>> baMenWangShuai = FeiQiMenUtil.baMenWangShuai(dto.getRenPan(), dto.getJiJie());
        dto.setBaMenWangShuai(baMenWangShuai);

    }

    /**
     * 飞盘奇门 - 斗转星移：九星旺衰
     *
     * @param dto 奇门斗转星移数据接收类
     */
    private void feiJiuXingWangShuai(PgQiMenDouZhuanXingYiDto dto) {

        List<List<String>> jiuXingWangShuai = FeiQiMenUtil.jiuXingWangShuai(dto.getTianPan(), dto.getHourZhi());
        dto.setJiuXingWangShuai(jiuXingWangShuai);

    }

    /**
     * 移星换斗：顺时针旋转
     *
     * @param list 宫位信息
     * @return 转宫后信息
     */
    private List<String> shunShiZhen(List<String> list) {

        List<String> newList = new ArrayList<>();

        newList.add(list.get(5)); // 坎一宫的数据变为原乾六宫的数据
        newList.add(list.get(8)); // 坤二宫的数据变为原离九宫的数据
        newList.add(list.get(7)); // 震三宫的数据变为原艮八宫的数据
        newList.add(list.get(2)); // 巽四宫的数据变为原震三宫的数据
        newList.add(list.get(4)); // 中五宫的数据不变
        newList.add(list.get(6)); // 乾六宫的数据变为原兑七宫的数据
        newList.add(list.get(1)); // 兑七宫的数据变为原坤二宫的数据
        newList.add(list.get(0)); // 艮八宫的数据变为原坎一宫的数据
        newList.add(list.get(3)); // 离九宫的数据变为原巽四宫的数据

        return newList;

    }

    /**
     * 移星换斗：逆时针旋转
     *
     * @param list 宫位信息
     * @return 转宫后信息
     */
    private List<String> niShiZhen(List<String> list) {

        List<String> newList = new ArrayList<>();

        newList.add(list.get(7)); // 坎一宫的数据变为原艮八宫的数据
        newList.add(list.get(6)); // 坤二宫的数据变为原兑七宫的数据
        newList.add(list.get(3)); // 震三宫的数据变为原巽四宫的数据
        newList.add(list.get(8)); // 巽四宫的数据变为原离九宫的数据
        newList.add(list.get(4)); // 中五宫的数据不变
        newList.add(list.get(0)); // 乾六宫的数据变为原坎一宫的数据
        newList.add(list.get(5)); // 兑七宫的数据变为原乾六宫的数据
        newList.add(list.get(2)); // 艮八宫的数据变为原震三宫的数据
        newList.add(list.get(1)); // 离九宫的数据变为原坤二宫的数据

        return newList;

    }


}
